#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_process.h"
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

static SubProcess_t *subprocess[MAX_SUBPROCESS]; // 子进程数组
static char *subprocess_name[] = {"app", "ota"}; // 子进程名称数组
static int is_running = 1;                       // 守护进程是否正在运行

void sighandler_func(int signal)
{
    is_running = 0;
}

int daemon_runner_star(void)
{
    daemon(0, 1); // 守护进程，该函数使得当前进程不会卡在终端上，而是后台运行

    close(STDIN_FILENO);  // 关闭标准输入 ==> 0
    close(STDOUT_FILENO); // 关闭标准输出 ==> 1
    close(STDERR_FILENO); // 关闭标准错误 ==> 2

    open("/dev/null", O_RDWR);                         // 重定向标准输入到空设备，即丢弃所有输入
    open(EXE_PATH, O_CREAT | O_RDWR | O_APPEND, 0644); // 重定向标准输入到文件
    open(EXE_PATH, O_CREAT | O_RDWR | O_APPEND, 0644); // 重定向标准输出到文件

    signal(SIGTERM, sighandler_func); // 重写信号处理函数

    for (size_t i = 0; i < MAX_SUBPROCESS; i++)
    {
        subprocess[i] = daemon_process_init(subprocess_name[i]); // 初始化子进程
    }

    while (is_running)
    {
        for (size_t i = 0; i < MAX_SUBPROCESS; i++)
        {
            daemon_process_checkExece(subprocess[i]); // 检查子进程是否正常运行
        }
        sleep(2); // 每隔2秒检查一次子进程
    }
    for (size_t i = 0; i < MAX_SUBPROCESS; i++)
    {
        daemon_process_destory(subprocess[i]); // 销毁子进程
    }
    return 0;
}
